#ifndef VECTOR_H_INCLUDED
#define VECTOR_H_INCLUDED

#include <math.h>

typedef struct {
    double x;
    double y;
    double z;
}Vector;

#define SETVECTOR( Vx , a , b , c )  \
    (Vx).x = (a);                    \
    (Vx).y = (b);                    \
    (Vx).z = (c);

#define ADD( Vx , Vy , Vz )          \
    (Vz).x = (Vx).x + Vy.x;          \
    (Vz).y = (Vx).y + Vy.y;          \
    (Vz).z = (Vx).z + Vy.z;

#define SUB( Vx , Vy , Vz )          \
    (Vz).x = (Vx).x - (Vy).x;        \
    (Vz).y = (Vx).y - (Vy).y;        \
    (Vz).z = (Vx).z - (Vz).z;

#define SCALE( Vx , scalar , Vy )    \
    (Vy).x = (scalar) * (Vx).x;      \
    (Vy).y = (scalar) * (Vx).y;      \
    (Vy).z = (scalar) * (Vx).z;

#define CROSSDOT( Vx , Vy ,  Vz )                 \
    (Vz).x = (Vx).y * (Vy).z - (Vx).z * (Vy).y;   \
    (Vz).y = (Vx).z * (Vy).x - (Vx).x * (Vy).z;   \
    (Vz).z = (Vx).x * (Vy).y - (Vx).y * (Vy).x;

#define DOT( Vx ,Vy , dot )      \
    (dot) = (Vx).x * (Vy).x + (Vx).y * (Vy).y + (Vx).z * (Vy).z;

#define NORM2( Vx , length )     \
    (length) = sqrt( (Vx).x * (Vx).x + (Vx).y * (Vx).y + (Vx).z * (Vx).z );


#define NORMALIZE( Vx )          \
    double length = sqrt( (Vx).x * (Vx).x + (Vx).y * (Vx).y + (Vx).z * (Vx).z );  \
    (Vx).x /= length;            \
    (Vx).y /= length;            \
    (Vx).z /= length;

#endif
